#!/usr/bin/env node

// 电调问题诊断脚本
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);

console.log("🔧 电调问题诊断脚本");

async function runCommand(command) {
  try {
    const result = await execAsync(command);
    return { success: true, stdout: result.stdout.trim(), stderr: result.stderr.trim() };
  } catch (error) {
    return { success: false, error: error.message, stdout: '', stderr: error.stderr || '' };
  }
}

async function diagnoseESC() {
  console.log("\n🔍 开始电调问题诊断...");
  
  // 1. 检查WiringPi版本
  console.log("1. 检查WiringPi版本:");
  try {
    const version = await execAsync('gpio -v');
    console.log(`   ${version.stdout.split('\n')[0]}`);
  } catch (error) {
    console.log(`   检查失败: ${error.message}`);
  }
  
  // 2. 检查引脚模式
  console.log("2. 检查引脚13当前模式:");
  try {
    const mode = await execAsync('gpio -g mode 13');
    console.log(`   当前模式: ${mode.stdout.trim()}`);
  } catch (error) {
    console.log(`   检查失败: ${error.message}`);
  }
  
  // 3. 设置引脚为输出模式
  console.log("3. 设置引脚13为输出模式:");
  try {
    await execAsync('gpio -g mode 13 out');
    console.log("   设置成功");
  } catch (error) {
    console.log(`   设置失败: ${error.message}`);
  }
  
  // 4. 测试不同的PWM值
  console.log("4. 测试不同的PWM值:");
  const pwmValues = [0, 128, 256, 512, 768, 1024];
  
  for (const value of pwmValues) {
    console.log(`   测试PWM值 ${value}:`);
    try {
      // 设置PWM模式
      await execAsync('gpio -g mode 13 pwm');
      // 设置PWM值
      await execAsync(`gpio -g pwm 13 ${value}`);
      console.log(`     设置成功`);
      
      // 等待2秒观察效果
      await new Promise(resolve => setTimeout(resolve, 2000));
      
      // 重置为输出模式
      await execAsync('gpio -g mode 13 out');
    } catch (error) {
      console.log(`     设置失败: ${error.message}`);
    }
  }
  
  // 5. 执行电调校准序列
  console.log("5. 执行电调校准序列:");
  try {
    // 设置为输出模式
    await execAsync('gpio -g mode 13 out');
    
    console.log("   发送最大油门信号 (2.0ms) - 请听电调声音...");
    // 模拟2.0ms高电平 (通过软件PWM)
    for (let i = 0; i < 50; i++) { // 发送50个周期
      await execAsync('gpio -g write 13 1');
      await sleep(2.0); // 2.0ms高电平
      await execAsync('gpio -g write 13 0');
      await sleep(18.0); // 18.0ms低电平
    }
    
    await new Promise(resolve => setTimeout(resolve, 3000)); // 等待3秒
    
    console.log("   发送最小油门信号 (1.0ms) - 请听电调声音...");
    // 模拟1.0ms高电平
    for (let i = 0; i < 50; i++) { // 发送50个周期
      await execAsync('gpio -g write 13 1');
      await sleep(1.0); // 1.0ms高电平
      await execAsync('gpio -g write 13 0');
      await sleep(19.0); // 19.0ms低电平
    }
    
    await new Promise(resolve => setTimeout(resolve, 3000)); // 等待3秒
    
    console.log("   发送中性信号 (1.5ms)...");
    // 模拟1.5ms高电平
    for (let i = 0; i < 50; i++) { // 发送50个周期
      await execAsync('gpio -g write 13 1');
      await sleep(1.5); // 1.5ms高电平
      await execAsync('gpio -g write 13 0');
      await sleep(18.5); // 18.5ms低电平
    }
    
    console.log("   ✅ 电调校准序列完成");
  } catch (error) {
    console.log(`   ❌ 校准失败: ${error.message}`);
  }
  
  // 6. 测试标准控制信号
  console.log("6. 测试标准控制信号:");
  try {
    await execAsync('gpio -g mode 13 out');
    
    // 发送中性信号
    console.log("   发送中性信号...");
    await sendStandardPWM(13, 1.5, 2000);
    
    // 发送前进信号
    console.log("   发送前进信号...");
    await sendStandardPWM(13, 1.7, 2000);
    
    // 回到中性
    console.log("   回到中性信号...");
    await sendStandardPWM(13, 1.5, 1000);
    
    console.log("   ✅ 标准控制信号测试完成");
  } catch (error) {
    console.log(`   ❌ 标准控制信号测试失败: ${error.message}`);
  }
}

// 发送标准PWM信号
async function sendStandardPWM(pin, dutyCycleMs, durationMs) {
  const periodMs = 20; // 50Hz = 20ms周期
  const highTimeMs = dutyCycleMs;
  const lowTimeMs = periodMs - dutyCycleMs;
  
  const cycles = Math.floor(durationMs / periodMs);
  
  for (let i = 0; i < cycles; i++) {
    await execAsync(`gpio -g write ${pin} 1`);
    await sleep(highTimeMs);
    await execAsync(`gpio -g write ${pin} 0`);
    await sleep(lowTimeMs);
  }
}

// 精确延时函数（毫秒）
function sleep(ms) {
  return new Promise(resolve => {
    const start = Date.now();
    while (Date.now() - start < ms) {
      // 空循环等待
    }
    resolve();
  });
}

async function main() {
  console.log("🚀 开始电调问题诊断");
  
  await diagnoseESC();
  
  console.log("\n📋 诊断完成");
  console.log("\n💡 可能的解决方案:");
  console.log("1. 如果电调发出不同的蜂鸣声，说明校准成功，可以尝试控制");
  console.log("2. 如果电调持续发出同一种声音，可能需要重新校准");
  console.log("3. 检查电调电源是否充足");
  console.log("4. 检查电机连接是否正确");
  console.log("5. 确认电调是否支持当前的PWM频率和脉冲宽度");
}

main();